package dependency

import (
	"github.com/go-xorm/xorm"
	"gluenet/internal/pkg/infra"
)

type MetaRepo interface {
	// Add 插入一个实例到数据库
	// 实例是一个接口，不同的实现，插入到的数据表不一样，具体实例见domain/entity
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var cfg = config{}
	//		cfg.ID = "xx00"
	//		if obj,err :=Add(config);err !=nil {
	//			return err
	//		}
	Add(obj infra.Entity) (infra.Entity, error)

	// Del 从数据库中删除数据，
	// entity的有效字段为删除条件
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var cfg = config{}
	//		cfg.ID = "xx00"
	//		if obj,err :=Del(config);err !=nil {
	//			return err
	//		}
	Del(obj infra.Entity) (infra.Entity, error)

	Upt(obj infra.Entity) (infra.Entity, error)

	// FindOne 从数据库重查找一条数据，
	// query为查询条件
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var obj config
	//		if obj,err :=FindOne(&obj, map[string]interface{}{
	//			"id": "xx",
	//		});err !=nil {
	//			return err
	//		}
	FindOne(obj interface{}, query interface{}, args ...interface{}) error

	// FindBy 从数据库重查找多条数据，
	// query为查询条件
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var objs []config
	//		if obj,err :=FindBy(&objs, map[string]interface{}{
	//			"id": "xx",
	//		});err !=nil {
	//			return err
	//		}
	FindBy(objs interface{}, query interface{}, args ...interface{}) error

	// Join 从数据库重查找多条数据，
	// query为查询条件
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var objs []config
	//		if obj,err :=Join(&objs,"INNER", "group", "group.id = user.group_id");err !=nil {
	//			return err
	//		}

	// FindAll 从数据库重查找某一张表的所有数据，
	// query为查询条件
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var objs []config
	//		if obj,err :=FindAll(&objs, map[string]interface{}{
	//			"id": "xx",
	//		});err !=nil {
	//			return err
	//		}
	FindAll(objs interface{}) error

	// PutKV 将结构数据存放到KV数据库中
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var objs config
	//		obj.ID = "123"
	//		if obj,err :=PutKV("test_key", obj);err !=nil {
	//			return err
	//		}
	PutKV(key string, value interface{}) error

	// DelKV 将指定key的结构数据
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var objs config
	//		obj.ID = "123"
	//		if obj,err :=PutKV("test_key", obj);err !=nil {
	//			return err
	//		}
	//		if obj,err :=DelKV("test_key");err !=nil {
	//			return err
	//		}
	DelKV(key string) error

	// DelWithPrefix 将key的前缀字符为prefix的结构数据从KV数据库中删除
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var objs config
	//		obj.ID = "123"
	//		if obj,err :=PutKV("test_key", obj);err !=nil {
	//			return err
	//		}
	//		if obj,err :=DelWithPrefix("test");err !=nil {
	//			return err
	//		}
	DelWithPrefix(prefix string) error

	// FindKV 将指定key的结构数据
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var cfg config
	//		if obj,err :=FindKV("test_key", &cfg);err !=nil {
	//			return err
	//		}
	FindKV(key string, value interface{}) error

	// FindKVsWithPrefix 查找key的前缀字符为prefix的结构数据
	//
	// eg:
	//		type struct config{
	//			infra.Entity
	//			ID string
	//		}
	// 		var cfg []config
	//		if obj,err :=FindKeysWithPrefix("test", &cfg);err !=nil {
	//			return err
	//		}
	FindKVsWithPrefix(prefix string, values interface{}) error

	// FindKVsWithPrefix 查找key的前缀字符为prefix的keys
	//
	// eg:
	// 		var keys []string
	//		if obj,err :=FindKeysWithPrefix("test", &keys);err !=nil {
	//			return err
	//		}
	FindKeysWithPrefix(prefix string, keys interface{}) error

	Engine() *xorm.Engine

	ListRepoCharts(repo string, url string) (map[string][]infra.ChartInfoSimple, error)
	ImportRepoChart(repo string, chart string, version string, userId string) (*infra.HelmInfo, error)
}
